package com.sangeng.utils;

import io.jsonwebtoken.*;
import io.jsonwebtoken.security.Keys;

import java.nio.charset.StandardCharsets;
import java.security.Key;
import java.util.Date;
import java.util.UUID;

/**
 * JWT 工具类（适配 jjwt 0.11.5）
 */
public class JwtUtil {

    // 默认有效期为 24 小时
    public static final Long JWT_TTL = 24 * 60 * 60 * 1000L;

//    // 密钥算法
//    public static final SignatureAlgorithm SIGNATURE_ALGORITHM = SignatureAlgorithm.HS256;
//
//    // 自动生成的安全密钥（256位）
//    private static final Key JWT_KEY = Keys.secretKeyFor(SIGNATURE_ALGORITHM);

    // 固定的签名算法
    public static final SignatureAlgorithm SIGNATURE_ALGORITHM = SignatureAlgorithm.HS256;

    // 固定密钥字符串（Base64 编码，确保是 256 位以上）
    private static final String SECRET_STRING = "a1b2c3d4e5f67890a1b2c3d4e5f67890a1b2c3d4e5f67890a1b2c3d4e5f6";

    // 基于固定字符串生成密钥
    private static final Key JWT_KEY = Keys.hmacShaKeyFor(SECRET_STRING.getBytes(StandardCharsets.UTF_8));

    public static String getUUID() {
        return UUID.randomUUID().toString().replaceAll("-", "");
    }

    /**
     * 生成JWT
     * @param subject token中要存放的数据（json格式）
     * @return token字符串
     */
    public static String createJWT(String subject) {
        return createJWT(subject, JWT_TTL);
    }

    /**
     * 生成JWT
     * @param subject token中要存放的数据（json格式）
     * @param ttlMillis token超时时间
     * @return token字符串
     */
    public static String createJWT(String subject, Long ttlMillis) {
        return createJWT(getUUID(), subject, ttlMillis);
    }

    /**
     * 创建token
     * @param id 唯一ID
     * @param subject 主题（用户信息等）
     * @param ttlMillis 过期时间
     * @return token字符串
     */
    public static String createJWT(String id, String subject, Long ttlMillis) {
        return getJwtBuilder(subject, ttlMillis, id).compact();
    }

    /**
     * 获取JwtBuilder
     */
    private static JwtBuilder getJwtBuilder(String subject, Long ttlMillis, String uuid) {
        long nowMillis = System.currentTimeMillis();
        Date now = new Date(nowMillis);

        if (ttlMillis == null || ttlMillis <= 0) {
            ttlMillis = JWT_TTL;
        }

        long expMillis = nowMillis + ttlMillis;
        Date expDate = new Date(expMillis);

        return Jwts.builder()
                .setId(uuid)
                .setSubject(subject)
                .setIssuer("sg")
                .setIssuedAt(now)
                .setExpiration(expDate)
                .signWith(JWT_KEY); //
    }

    /**
     * 解析JWT
     * @param jwt token字符串
     * @return Claims
     */
    public static Claims parseJWT(String jwt) throws JwtException {
        return Jwts.parserBuilder()
                .setSigningKey(JWT_KEY)
                .build()
                .parseClaimsJws(jwt)
                .getBody();
    }
}
